EVGAP-02:CRC-specific linkage 证据抽取契约(contract-only,未执行;Track A) - #61
Merged
Conversation
Freezes one evidence-extraction run that would discharge EVGAP-02, the gap that blocks LOCK-03. Nothing is executed, no search is issued, and Level 01 remains unauthorised because EVGAP-01 is still open. This is Track A, which the source document puts ahead of SRCADM-01 and EVGAP-01. The contract is independent of both: LOCK-03 asks why a target relates to a CRC clinical context, which has nothing to do with surface topology, so it reads no surfaceome reference and is unaffected by that database's admission status. Its only blocker is its own approval. That independence is also why the scope covers all 369 pairs rather than the 22 that EVGAP-01 might later make eligible - scoping to 22 would make this run depend on unadmitted surfaceome verdicts and would stop the two tracks running in parallel. Governance finding: no review record in the repository mentions any local derived database at all. The surfaceome admission problem found in PR #59 is the general case, not an exception. Sources are therefore tiered. Tier 1 primary public sources - PubMed/PMC, ClinicalTrials.gov, TCGA/GEO/HPA, plus the approved enumeration axis - are usable directly, on the distinction the reviewer drew in PR #59: a primary source is not a derived database and its content traces straight back to the original record. Tier 1 alone can carry this extraction, so the contract is executable on approval. Tier 2 derived local databases are barred until each is admitted, and four pending admissions are registered with null record refs. Four linkage classes are frozen. RNA may establish linkage existence but never satisfies LOCK-01, checked against the Level 01 contract in both directions. Other-cancer-only precedent is metadata and holds. Class C, new here at the source document's request, admits naked antibody, CAR-T, bispecific, radioimmunotherapy, immunotoxin and imaging antibody as proof that the target is reachable in CRC, while requiring is_adc_efficacy_evidence false on every such row. Disease-level CRC evidence supports the canonical context only; a subgroup needs class D. The declared search scope is the load-bearing part. PR #58 barred no_known_linkage_after_complete_search because the search scope was not closed; freezing it is what makes that outcome available, turning "was the required search completed" into a decidable fact rather than an executor's self-assertion. An unreachable source marks that target's search incomplete and silent skipping is forbidden. Precedence is frozen with completeness first, since "not found" cannot be distinguished from "does not exist" before the search closes. Exactly one rule may retain and exactly one may exclude, and the exclusion is EXCLUDE_FROM_ACTIVE_POOL with is_scientific_disproof and is_killed false. A reference implementation exhausts all 32 combinations of the five conditions and proves each resolves to exactly one reachable rule. No result shape is predicted, deliberately. EVGAP-01 reads a pinned dataset so its counts can be computed in advance; EVGAP-02 discovers evidence, and quoting counts now would pass a prediction off as a result, which the source document names as the second confusion to avoid. 334 tests pass. Thirteen mutations caught and rolled back exactly. One error in my own test was caught and fixed: it asserted every rule but L3-05 defers, missing that L3-02 is the retain rule. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…2-crc-linkage-contract # Conflicts: # logs/worklog.md
All three blockers accepted. Blocker 1: class D never entered search completeness, and endpoint coverage was left to the executor. The contract said A/B/C are searched per target and D is assessed per pair, but search_complete_definition only required the three source classes per target. Both consequences the reviewer named are real: a subgroup pair could land on L3-03 without D ever being searched, and L3-05's "no class hit" could fire with D unsearched. Separately, peer_reviewed_literature has two endpoints and public_molecular_dataset three, while the contract only demanded source-class coverage, so an executor could query one and stop. per_pair_required_class_d_search now covers all 369 pairs with six recorded fields that also appear in the disposition table, and an incomplete D search forces L3-01 rather than L3-03 or L3-05. Completeness now requires both levels, coverage_unit is endpoint, and every source class declares all_endpoints_required with an explicit minimum_endpoint_set. Blocker 2: nothing tied a disposition row to the evidence rows behind it. With only evidence_row_count, an L3-02 retain could not answer which A/B/C evidence supported it, which D evidence carried a subgroup, or whether other-cancer precedent was present without being counted as linkage. Worse, my test validated the conditionally required columns against the union of both tables, which is precisely what masked this. Evidence rows now carry a unique evidence_id, dispositions carry supporting, class-D and other-cancer reference lists, and evidence_reference_requirements freezes per rule what must and must not be cited, with L3-02 split by context kind. Each conditional block now names its table and the test checks per table instead of the union. Blocker 3: synced origin/main and resolved logs/worklog.md chronologically, with main's 12:45 entry before mine at 13:30. Verified afterwards that the diff against main is still exactly five files, that none of PR #60's preview output leaked in, and that no unrelated contract came with it. One operational mistake of my own, caught and repaired: switching branches to handle PR #60 I ran git stash -u, which swept the uncommitted blocker 1 and 2 YAML edits into the stash, and I did not restore them on returning, so later edits landed on the unrevised file and the tests raised KeyError. Located stash@{0}, discarded the conflicting edit, popped all 133 lines back and redid the work with nothing lost. 338 tests pass. Twelve mutations caught and rolled back exactly. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This was referenced Aug 5, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
状态
三条阻断已全部接受并修订完毕。 请复审。
57cb10b(首轮受审430e85f)mergeable=MERGEABLE,state=CLEAN,5 个文件(已核验未混入 PR ADC Pool Level 01 Preview 结果审核(PROVISIONAL_NOT_AUTHORIZED_FOR_ADVANCEMENT) #60 的 preview 结果)Ran 338 tests全部通过(基线 309 + 新增 29,测试由 25 增至 29)阻断 1(接受):D 类检索没有真正进入 search completeness,且 endpoint 覆盖语义未冻结
你指出的两个后果都成立:subgroup pair 可能在未真正检索 D 类时直接落
L3-03;L3-05的「四类均无命中」也可能在 D 类未检索时被错误触发。另外peer_reviewed_literature有 PubMed/PMC 两个 endpoint、public_molecular_dataset有三个,而契约只要求覆盖 source class——执行者可以只查其中一个,结果不可复现。per_pair_required_class_d_search,369 个 pair 全覆盖,每 pair 记录六个字段(class_d_query_expression/class_d_executed_at/class_d_result_count/class_d_reachable/class_d_source_coverage_ref/class_d_search_complete),六个字段同时进入disposition_columnsincomplete_consequence: L3-01——D 类未完成必须落L3-01,不得落L3-03或L3-05(VAL-L18);L3-03/L3-05加requires_class_d_search_complete: truesearch_complete_requires_both_levels: true,两级为 target 级 endpoint 覆盖 + pair 级 D 类覆盖coverage_unit: endpoint,每个 source class 加all_endpoints_required: true与minimum_endpoint_set:PubMed 与 PMC;ClinicalTrials.gov;TCGA 与 GEO 与 HPA。缺任一 endpoint 该 target 全部 pair 落L3-01(VAL-L19)阻断 2(接受):disposition 与 evidence 之间没有稳定引用关系
初稿只有
evidence_row_count,单条 disposition 无法证明自己由哪些 evidence 行支持。而我的测试用两张表列的并集验证条件必填字段——这恰好掩盖了问题。这条批评对测试方法本身比对契约更准。evidence_idsupporting_evidence_refs/class_d_evidence_refs/other_cancer_evidence_refsevidence_reference_requirements,逐规则冻结:L3-01L3-02canonicalL3-02subgroupL3-03L3-04L3-05VAL-L16(引用 id 必须存在于 evidence 表且pair_id一致)、VAL-L17(逐规则引用约束)、VAL-L20(evidence_row_count必须等于三组 refs 去重后总条数)conditionally_required_columns块加table字段,测试改为逐表检查,不再用并集阻断 3(接受):PR 不可合并
同步
origin/main(0190a73),logs/worklog.md冲突按时间顺序解决(main 的 12:45 EDT 在前、我的 13:30 在后),断言无残留冲突标记、两侧条目与标题全在。合并后核验:相对
main仍只有 5 个文件,未混入 PR #60 的 preview 结果(grep -c preview= 0),未引入其他无关契约,CI 通过。一处我自己的操作失误
中途为处理 PR #60 切分支时执行了
git stash -u,把阻断 1/2 的未提交 YAML 改动一并藏入栈,切回后没恢复,导致后续编辑落在未修订版本上、测试报KeyError。已定位stash@{0}、丢弃冲突编辑、git stash pop恢复全部 133 行后重做,无内容丢失。记录在此以免重犯。本轮变异检验
12 个全部被捕获后精确回滚:把 D 类改为非必需、让 D 类未完成落
L3-03、让L3-05不要求 D 类完成、让完整性只要 target 级、覆盖粒度退回 source class、只查 PubMed 就算覆盖、去掉evidence_id、让L3-04可引用 supporting refs、让 subgroup RETAIN 不需 D refs、让L3-05可引用证据、把必填列声明到错误的表、删掉L3-03的 D refs 为空约束。这个 PR 是什么
冻结一次证据抽取的范围、来源分层、四类 linkage 判据、求值优先级、检索范围与输出验证,用于解除 PR #58 登记的
EVGAP-02——它阻断LOCK-03。不执行抽取,不发起任何检索,不执行 Level 01,不解除
EVGAP-01。main基线e30a430,5 个文件 +1149/-0,Ran 334 tests全部通过(基线 309 + 新增 25)。判据取自
Asset-Generation-OS-architecture.md的# EVGAP-02 应该具体抽取什么与# EVGAP-02 最小结果标准。这是来源文档指定的 Track A,优先级高于SRCADM-01/EVGAP-01(Track B)。一、与 EVGAP-01 独立,这决定了范围
independent_of: [EVGAP-01, SRCADM-01],blocked_by: [contract_approval]——唯一阻断是本契约自身的审核,获批即可执行。LOCK-03 问的是「target 为什么与这个 CRC clinical context 有关」,与表面拓扑无关,故不读 surfaceome 参考库、不受其准入状态影响。
因此抽取覆盖全部 369 个 pair,而不是 EVGAP-01 之后可能 eligible 的 22 个。若只覆盖 22 个,本抽取就会依赖尚未准入的 surfaceome 判定结果,既污染来源,也使两条 track 无法并行。
二、核查发现:派生库未获准入是普遍状况
仓库内
logs/chatgpt-review-*.md中没有任何一条提及过任何本地派生数据库。 PR #59 发现的 surfaceome 问题不是孤例。Tier 1:原始公开来源,可直接使用
PubMed/PMC、ClinicalTrials.gov、TCGA/GEO/HPA,加已批准的枚举轴(PR #29)。每类都规定了必须记录的 provenance 字段。
依据是 PR #59 审核所作的区分:原始公开来源不是派生数据库,内容可由
source_locator直接回溯到原始记录,不存在「构建逻辑是否遵守声明」的问题。这一层足以支撑本次抽取,所以本契约获批后即可执行,无需等待任何 admission。Tier 2:派生本地库一律禁用至各自获准入
SRCADM-02nullSRCADM-03nullSRCADM-04nullSRCADM-05null后果写明:检索完整性只在 Tier 1 声明范围内成立。 日后某库获准入需另开 PR 扩大范围并重跑,不得静默扩大(
VAL-L10)。三、四类判据,C 类是本契约新增
A CRC human tumor expression:蛋白优先;RNA 可证明 linkage 存在但绝不得替代 LOCK-01,必须标注。测试与 Level 01 契约双向校验。
B CRC-specific ADC precedent:CRC 试验/preclinical/cell line/PDO/PDX/动物模型。仅其他癌种 precedent 不算 linkage,降为
metadata_only_hold(L3-04),与 #58 一致。C CRC-specific target-directed modality evidence(新增):naked antibody、CAR-T、bispecific、radioimmunotherapy、immunotoxin、imaging antibody。证明 target 在 CRC 中可接近或可干预,满足 LOCK-03 存在性(该锁只问关联、不问 ADC 疗效),但必须标注
is_adc_efficacy_evidence: false(VAL-L04、MF-L02)。D Context-specific enrichment:疾病级 CRC 证据只支持 canonical context,亚群必须有 D 类证据才能 RETAIN。
四、检索范围冻结——本契约最关键的一节
PR #58 判定
no_known_linkage_after_complete_search不可用,理由是检索范围未闭合。本契约冻结范围,正是使该 outcome 变为可用的前提:范围一旦冻结,「是否完成规定检索」就成为可判定的事实,而不是执行者的自我声明。query_expression、executed_at、result_count、reachablesilent_skip_forbidden: true检索粒度也写明:A/B/C 的疾病级检索按 target 一次(41),D 类按 pair(369)——避免「检索次数」这个数字被误读。
五、五条规则与 32 组合穷举证明
优先级
L3-01→L3-02→L3-03→L3-04→L3-05。先判检索是否完成——未完成时「没找到」无法与「不存在」区分。L3-01linkage_evidence_missingL3-02linkage_evidence_existsL3-03linkage_unassessedL3-04linkage_unassessedL3-05no_known_linkage_after_complete_search只有
L3-02可 RETAIN、只有L3-05可 EXCLUDE,测试断言各恰好一条。L3-05的 EXCLUDE 严格限定为EXCLUDE_FROM_ACTIVE_POOL,is_scientific_disproof与is_killed均false,须六项完整性字段齐备。测试用参考实现穷举
search_complete × crc_specific × canonical × class_d × other_cancer的全部 32 种组合,证明每种恰好命中一条且五条规则均可达——PR #59 阻断 4 的教训,这次一开始就做。六、本契约有意不给预期结果形状
EVGAP-01 读固定数据集,结果可事先算出并逐项核对(22/19)。EVGAP-02 是发现型检索,事先给这类数字就是把预测冒充成结果——来源文档列为第二种必须避免的混淆。
改为冻结
declared_search_scope、search_complete_definition、derivation_precedence、provenance 要求与输出验证。测试断言provided: false,且不得以任何别名偷偷塞入计数(变异检验含此项)。七、沿用前几轮教训
source_supported/no_evidence_found_after_complete_search/search_incomplete。后两种允许source_ref为空但禁止伪造,出现非空即验证失败(VAL-L08)。八、验证
Ran 334 tests通过;scripts/verify_repository_boundary.sh通过;git diff --check通过;零__pycache__。L3-03改判 RETAIN、完整检索排除改判 killed、检索完整性排到优先级最后、允许静默跳过来源、开放 Tier 2、自行填入SRCADM-02记录、偷偷加入预测计数、要求未找到证据的行也有source_ref、范围缩到依赖 LOCK-01 状态。L3-05外全部 DEFER」,漏了L3-02是 RETAIN 规则;改为逐规则断言并加「恰好一条 RETAIN、恰好一条 EXCLUDE」。九、授权与不授权
授权: 获
APPROVE后按本契约执行一次抽取,读取 Tier 1 来源,覆盖全部 369 个 pair。不授权: 执行 Level 01;解除
EVGAP-01;读取任何 Tier 2 派生库;把任何派生库纳入已批准来源;评估 T2/T7/任何 Gate;新增靶点或 context;任何筛选排序、Tier 划分、资产推荐或实验建议;引入被隔离运行(#53、#54)的任何产物。四条
mandatory_findings:MF-L01RETAIN 不表示适合 ADC/不表示疗效/不表示治疗窗;MF-L02C 类不是 ADC 疗效证据;MF-L03完整性只在 Tier 1 范围内成立;MF-L04RETAIN 不使 pair 进入 Level 02,EVGAP-01未解除前may_advance_to_level_02恒为false。十、架构影响
未触碰
src/、src/contracts/、genmodules/、extensions/、docs/architecture/、AGENTS.md、prompts/;未新增 Gate,未改 45-Gate 拓扑、生命周期、核心对象、envelope、Model 或 Profile。5 个文件全在docs/、tests/、logs/。不消耗 8 月月度架构修复额度。请重点看两点
本 PR 不适用
AGENTS.md「审核豁免」,须经 ChatGPTAPPROVE。批准只代表接受抽取边界的冻结并授权执行一次抽取;不批准任何 linkage 判定、不解除EVGAP-01、不授权执行 Level 01,也不批准任何靶点判定或科学结论。